//
//  CZOauthViewController.swift
//  GZWeibo007
//
//  Created by 黄伟 on 15/12/25.
//  Copyright © 2015年 itcast. All rights reserved.
//

import UIKit

import SVProgressHUD

/// 遵守协议
class CZOauthViewController: UIViewController,UIWebViewDelegate {
    
    /// webView开始加载,webViewDelegate的代理方法
    func webViewDidStartLoad(webView: UIWebView) {
        // 显示正在加载
        // showWithStatus会一直显示
        // showInfoWithStatus,过1s自动关闭
        SVProgressHUD.showWithStatus("正在加载", maskType: SVProgressHUDMaskType.Black)
    }
    
    /// webView加载完毕,webViewDelegate的代理方法
    func webViewDidFinishLoad(webView: UIWebView) {
        // 关闭指示器
        SVProgressHUD.dismiss()
    }
    
    /// 每次webView去加载一个页面的时候会调用下面方法
    /// webView是否要去加载一个网址，返回true去加载，false不去加载,webViewDelegate的代理方法
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        let url = request.URL!.absoluteString
        print("url:\(url)")
        
        // 只要点击，取消或授权，才会加载授权回调地址，其他情况不会加载授权回调地址
        // 不是授权回调地址，直接加载
        // 判断是否以CZNetworkTool.sharedInstance.redirect_uri开头
        if !url.hasPrefix(CZNetworkTool.sharedInstance.redirect_uri) {
            // 返回true去加载
            return true
        }
        
        // 是授权回调地址,判断是取消还是授权
        // 点击取消: http://www.baidu.com/?error_uri=%2Foauth2%2Fauthorize&error=access_denied&error_description=user%20denied%20your%20request.&error_code=21330
        // 点击授权:会以code=开头 http://www.baidu.com/?code=a61c2d7ec7b8c4c9c1962bf4354354c5
        // 获取url中?后面的内容: URL.query就是问号后面的东西
        if let query = request.URL?.query {
            // 能到这里面来,表示query有值
            let codeString = "code="
            // 判断query是否以code=开头
            
            if query.hasPrefix(codeString) {
                // 截取code的值
                // Stirng和NSString之间的转换是不需要添加as? 或 as! 直接使用as
                let queryNS = query as NSString
                let code = queryNS.substringFromIndex(codeString.characters.count)
                print("code = \(code)")
                
                // 调用当前类的loadAccessToken
                loadAccessToken(code)
            } else {
                self.close()
            }
            
        } else {
            print("query没有值")
        }
        
        return false
    }
    
    // 控制器加载AccessToken
    func loadAccessToken(code: String) {
        // 调用网络工具类加载AccessToken 
        CZNetworkTool.sharedInstance.loadAccessToken(code) { (result, error) -> () in
            // 判断网络请求是否有误
            // error == nil 模拟失败
            if error != nil {
                print("error: \(error)")
                
                SVProgressHUD.showInfoWithStatus("您的网络不给力")
                
                //延迟1秒关闭提示
                
                // 关闭授权控制器
                self.close()
                
                return
            }
            
            // 能到下面来就说明网络请求成功,获取到了AccessToken
//            print("result: \(result)")
            // 保存AccessToken
            //字典转模型
            let userAccount = CZUserAccount(dict: result!)
            
            // 保存对象到沙盒
            userAccount.saveUserAccount()
            
            // 切换到欢迎界面
            (UIApplication.sharedApplication().delegate as! AppDelegate).switchRootViewController(false)
            
            // 关闭登录界面
            self.close()
            
            print("userAccount: \(userAccount)")
        }
    }
    
    // 在这赋值的话,不需要添加约束,系统会自动添加约束
    override func loadView() {
        view = webView
        
        // 指定代理
        webView.delegate = self
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 这样添加是可以的,缺点是需要我们自己手动来添加约束
        //        view.addSubview(webView)
        
        // 加载登录界面，URL在CZNetworkTool准备好了
        let url = CZNetworkTool.sharedInstance.oAuthRUL()
        let request = NSURLRequest(URL: url)
        webView.loadRequest(request)
        
        // 设置导航栏
        // 左边填充
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "填充", style: UIBarButtonItemStyle.Plain, target: self, action: "autoFill")
        
        // 右边,取消
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "取消", style: UIBarButtonItemStyle.Plain, target: self, action: "close")
        
        // 设置标题
        navigationItem.title = "登录"
    }
    
    /// 填充账号密码
    func autoFill() {
        // 创建js代码
        let js = "document.getElementById('userId').value='18819493849'; document.getElementById('passwd').value='hw417756148';"
        
        // 让webView来执行js代码
        webView.stringByEvaluatingJavaScriptFromString(js)
    }
    
    /// 关闭
    func close() {
        dismissViewControllerAnimated(true, completion: nil)
    }

    // MARK: - 懒加载
    // webView
    private lazy var webView = UIWebView()
}
